﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleData.Infrastructure.Utils
{
	/// <summary>
	/// Dados da validação que deve ser realizada
	/// </summary>
	/// <typeparam name="TValue"></typeparam>
	public struct InputValidator<TValue> : IInputValidator<TValue>
	{
		private Func<Exception> exceptionRaiser;


		//internal InputValidator( TValue value )
		//{
		//    this.Value = value;
		//    //this.ParameterName = name;
		//}

		
		/// <summary>
		/// 
		/// </summary>
		public TValue Value
		{
			get;
			internal set;
		}

		#region IInputValidator Members

		//public string ParameterName
		//{
		//    get;
		//    private set;
		//}

		public void OverrideException( Func<Exception> throws )
		{
			this.exceptionRaiser = throws;
		}

		public void Throws( Exception ex )
		{
			if ( this.exceptionRaiser != null )
				throw this.exceptionRaiser();
			else if ( ex != null )
				throw ex;
			else
				throw new Exception();
		}

		#endregion

		public static InputValidator<TValue> Create( TValue value )
		{
			InputValidator<TValue> input = new InputValidator<TValue>();
			input.Value = value;
			input.exceptionRaiser = null;
			return input;
		}
	}

	public interface IInputValidator
	{
		/// <summary>
		/// Obtém o nome do parâmetro que está sendo verificado
		/// </summary>
		//string ParameterName
		//{ get; }

		/// <summary>
		/// Redefine a exceção que deve ser lançada.
		/// </summary>
		/// <param name="throws"></param>
		void OverrideException( Func<Exception> throws );

		/// <summary>
		/// Lança uma exceção
		/// </summary>
		void Throws( Exception ex );
	}

	/// <summary>
	/// 
	/// </summary>
	/// <typeparam name="TValue"></typeparam>
	public interface IInputValidator<out TValue> : IInputValidator
	{
		/// <summary>
		/// Valor que está sendo validado
		/// </summary>
		TValue Value
		{ get; }
	}
}
